package com.bai.boot.Controller;

import com.bai.boot.Util.JsonResult;
import com.bai.boot.pojo.BaseEntity;
import com.bai.boot.pojo.User;
import com.bai.boot.service.IUserService;
import com.bai.boot.service.ex.InsertExption;
import com.bai.boot.service.ex.UsernameDuplicatedException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.server.Session;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.jws.soap.SOAPBinding;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.UUID;

/**
 * @author 27471
 * Time : 2022/9/30 20:29
 */
@RestController//相当于@Controller+@ResponseBody
//@Controller
@RequestMapping("/users")
public class UserController extends BaseController {

    @Autowired
    private IUserService userService;

    @RequestMapping("/reg")
    // @ResponseBody//响应结果以Json格式响应
    public JsonResult<Void> reg(User user) {
        //响应结果
        userService.reg(user);
        return new JsonResult<Void>(OK);
    }

    @RequestMapping("/login")
    public JsonResult<User> login(@RequestParam("username") String username,
                                  @RequestParam("password") String password,
                                  HttpSession request) {
        User login = userService.login(username, password);
        request.setAttribute("uid", login.getUid());
        request.setAttribute("username", login.getUsername());
        // System.out.println(getUidFromSession(request));
        // System.out.println(getUsenameFromSession(request));
        return new JsonResult<User>(OK, login);
    }

    @RequestMapping("/change_password")
    public JsonResult<Void> changePassword(String oldPassword, String newPassword, HttpSession session) {
        Integer fromSession = getUidFromSession(session);
        String usenameFromSession = getUsenameFromSession(session);
        userService.UpdatePasswordByUid(fromSession, usenameFromSession, oldPassword, newPassword);
        return new JsonResult<Void>(OK);
    }

    //设置上传文件的最大值
    public static final int AVATAR_MAX_SIZE = 10 * 1024;
    //设置上传文件的类型
    public static final List<String> AVATAR_TYPE = new ArrayList<>();

    static {
        AVATAR_TYPE.add("images/jpeg");
        AVATAR_TYPE.add("images/png");
        AVATAR_TYPE.add("images/bmp");
        AVATAR_TYPE.add("images/gif");
    }

    /**
     * `q23`
     * SpringBoot整合了SpringMVC，只需要在书里请求的方法参数列表上生命一个参数为MultipartFile的参数，SpringBoot
     * 自动将传递的参数赋值给这个参数
     *
     * @param session
     * @param file
     * @return
     * @RequestParam() 表示请求中的参数，可以将请求中的参数注入请求处理方法的某个参数
     */
    @RequestMapping("/chang_avatar")
    public JsonResult<String> changeAvatar(HttpSession session
            , @RequestParam("file") MultipartFile file
    ) {
        //判断文件是否为空
        if (file.isEmpty()) {
            //文件为空
        }
        //判断文件大小
        if (file.getSize() > AVATAR_MAX_SIZE) {
            //文件超出限制
        }
        //判断文件类型是否符合
        String contentType = file.getContentType();
        //如果集合包含返回true
        //contains() list集合提供的判断某个元素是否在集合里
        if (!AVATAR_TYPE.contains(contentType)) {
            //文件类型不对
        }
        String upload = session.getServletContext().getRealPath("upload");
        File file1 = new File(upload);
        if (!file1.exists()) {//检测目录是否存在
            file1.mkdirs();//创建目录
        }
        //获取文件名称，UUID工具生成一个新的文件名
        String originalFilename = file.getOriginalFilename();//文件名
        int i = originalFilename.lastIndexOf(".");//获取文件中 . 的索引
        //substring()从字符串的索引位置到最后以为的值
        String substring = originalFilename.substring(i);
        String filename = UUID.randomUUID().toString().toUpperCase() + substring;
        File file2 = new File(file1,filename);//是一个空文件
        //将file中的数据写入file2中
        try {
            file.transferTo(file2);//将file中的数据写入file2中
        } catch (IOException e) {
            e.printStackTrace();
        }
        Integer uidFromSession = getUidFromSession(session);
        String usenameFromSession = getUsenameFromSession(session);
        //返回头像路径
        String avatar="/upload"+filename;
        userService.changeAvatar(uidFromSession,avatar,usenameFromSession);
        //返回用户头像的路径给前端，将来用于头像展示
        return new JsonResult<>(OK,avatar);
    }
}
